package com.example.lib_net.interceptor

import com.example.lib_net.common.ConstantValue
import com.example.lib_net.msgbus.LiveDataBus
import com.tencent.mmkv.MMKV
import okhttp3.Interceptor
import okhttp3.Response

/**
 * @author yaotianxue
 * @description
 * @date 2024/10/24
 */
class TokenInterceptor:Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        var response: Response? = null
        val token = MMKV.defaultMMKV().getString("token", "")
        if (!token.isNullOrEmpty()) {
            val newRequest = request.newBuilder().addHeader("token", token).build()
            response = chain.proceed(newRequest)
        } else {
            response = chain.proceed(request)
        }

        when (response?.code) {
            /*
            * 利用LiveDataBus 发送网络状态
            * */
            500 -> LiveDataBus.with<Int>(ConstantValue.NET_STATE).postValue(500)
            404 -> LiveDataBus.with<Int>(ConstantValue.NET_STATE).postValue(404)
            //token失效怎么办？
            //方案一：手动刷新token：发送事件总线401，监听事件跳转到登陆页面，重新获得token
            401 -> {
                val token = MMKV.defaultMMKV().getString("token", "")
                if (token.isNullOrEmpty()) {
                    LiveDataBus.with<Int>(ConstantValue.NET_STATE).postValue(401)
                }

            }
            //方案二：自动刷新token
//            1.客户端发起登陆请求，服务器返回access_token和refresh_token，access_token有效期2个小时，refresh_token有效期15天
//            2.网络请求数据携带access_token，服务器判断access_token若过期，就返回401错误码给客户端，客户端通过一个特定的api接口，传入refresh_token参数获得新的access_token和refresh_token，本地并更新
//            3.如果连续15天未使用app或者用户修改了密码，则表示refresh_token过期了，则跳转到登陆页面，重新获得新的access_token和refresh_token,本地并更新
//

        }
        if (response?.code == 401) {

            if (!token.isNullOrEmpty()) {
                val newRequest = request.newBuilder().addHeader("token", token).build()
                chain.proceed(newRequest)
            }
            response!!
        } else {
            response!!
        }
        return response

    }

}